#!/bin/bash
#
# author: Mario Schillermann
# website: http://code.google.com/p/bungeeservercontrol/

#################################
# Settings                      #
#################################

USERNAME="minecraft"
ROOT_SERVER_PATH="/home/minecraft/minecraft_server"
BACKUPPATH="/home/minecraft/backup/minecraft_server"
# s=seconds, m=minutes, h=hours, D=days, W=weeks, M=months, Y=years
BACKUP_REMOVE_OLDER_THAN='2M'

#################################
# Messages                      #
#################################

MSG_SERVER_ONLINE="[INFO] Server $SERVERNAME ist online."
MSG_SERVER_START="[INFO] Server $SERVERNAME wird gestartet..."
MSG_SERVER_NOT_START="[ERROR] Server $SERVERNAME konnte nicht gestartet werden."
MSG_SERVER_IS_RUN_NOW_START="[INFO] Server $SERVERNAME läuft... wird gestoppt."
MSG_SERVER_SHUTDOWN_ERROR="[INFO] Server $SERVERNAME konnte nicht herunter gefahren werden... er läuft noch."
MSG_SERVER_SHUTDOWN="[INFO] Server $SERVERNAME ist herunter gefahren."
MSG_SERVER_SHUTDOWN_NOW="Server $SERVERNAME wird herunter gefahren..."
MSG_SERVER_WAS_NOT_RUNNING="[INFO] Server $SERVERNAME lief nicht."
MSG_BACKUP_ERROR="[INFO] Server $SERVERNAME läuft! Ein Backup kann nicht erstellt werden."
MSG_BACKUP_DELETE="[INFO] Lösche Backups älter als $BACKUP_REMOVE_OLDER_THAN..."
MSG_BACKUP_START="[INFO] Erstelle ein Backup der Minecraft Daten..."
MSG_BACKUP_FINISH="[INFO] Backup beendet."
MSG_USAGE="[INFO] Usage: /etc/init.d/minecraft_server <server> <start|stop|backup|status|restart|do|say>"
MSG_SAVE_WORLD="Welt wird gespeichert..."

#################################
# Check Server                  #
#################################

if [ -z "$1" ]
  then
    echo $MSG_USAGE
    exit 0
fi

SERVERNAME=$1

if [ ! -d "$ROOT_SERVER_PATH/$SERVERNAME" ]; then
  echo "[ERROR] Server nicht gefunden"
  exit 0
fi

CRAFTBUKKIT_FILE=$SERVERNAME".jar"

#################################
# Check User                    #
#################################

ME=`whoami`
as_user() {
  if [ "$ME" == "$USERNAME" ] ; then
    bash -c "$1"
  else
    su - $USERNAME -c "$1"
  fi
}

bungeecord_alert() {
   as_user "screen -p 0 -S bungeecord -X eval 'stuff \"alert $1\"\015'"
   echo "$1"
}

#################################
# Start Server                  #
#################################

mc_start() {

  if ps ax | grep -v grep | grep -v -i SCREEN | grep $CRAFTBUKKIT_FILE > /dev/null
  then
     echo $MSG_SERVER_ONLINE
  else
    echo $MSG_SERVER_START
    as_user "cd $ROOT_SERVER_PATH/$SERVERNAME && screen -dmS $SERVERNAME java -jar $CRAFTBUKKIT_FILE nogui"
    sleep 7
    if ps ax | grep -v grep | grep -v -i SCREEN | grep $CRAFTBUKKIT_FILE > /dev/null
    then
      bungeecord_alert $MSG_SERVER_ONLINE
    else
      echo $MSG_SERVER_NOT_START
    fi
  fi
}

#################################
# Stop Server                   #
#################################

mc_stop() {
  if ps ax | grep -v grep | grep -v -i SCREEN | grep $CRAFTBUKKIT_FILE > /dev/null
    then
      echo $MSG_SERVER_IS_RUN_NOW_START
      as_user "screen -p 0 -S $SERVERNAME -X eval 'stuff \"say $MSG_SERVER_SHUTDOWN_NOW\"\015'"
      as_user "screen -p 0 -S $SERVERNAME -X eval 'stuff \"say $MSG_SAVE_WORLD\"\015'"
      as_user "screen -p 0 -S $SERVERNAME -X eval 'stuff \"save-all\"\015'"
      sleep  10
      as_user "screen -p 0 -S $SERVERNAME -X eval 'stuff \"stop\"\015'"
      sleep 7
      #  Check is server shut down
      if ps ax | grep -v grep | grep -v -i SCREEN | grep $CRAFTBUKKIT_FILE > /dev/null
        then
          echo $MSG_SERVER_SHUTDOWN_ERROR
        else
          bungeecord_alert $MSG_SERVER_SHUTDOWN
      fi 
    else
      echo $MSG_SERVER_WAS_NOT_RUNNING
    fi
}

###############################
# Server Backup               #
###############################

mc_backup() {
  if ps ax | grep -v grep | grep -v -i SCREEN | grep $CRAFTBUKKIT_FILE > /dev/null
  then
    echo $MSG_BACKUP_ERROR
  else
    echo $MSG_BACKUP_DELETE
    as_user "cd $ROOT_SERVER_PATH/$SERVERNAME && rdiff-backup --remove-older-than $BACKUP_REMOVE_OLDER_THAN $BACKUPPATH/$SERVERNAME/"
    echo $MSG_BACKUP_START
    as_user "cd $ROOT_SERVER_PATH/$SERVERNAME && rdiff-backup  $ROOT_SERVER_PATH/$SERVERNAME/ $BACKUPPATH/$SERVERNAME/"
  fi
  echo $MSG_BACKUP_FINISH
}

###############################
# Server Status               #
###############################

mc_status() {
  if ps ax | grep -v grep | grep -v -i SCREEN | grep $CRAFTBUKKIT_FILE > /dev/null
    then
      echo $MSG_SERVER_ONLINE
    else
      echo $MSG_SERVER_SHUTDOWN
    fi
}

##############################
# Server Action              #
##############################

case "$2" in
  start)
    mc_start
    ;;
  stop)
    mc_stop
    ;;
  restart)
    mc_stop
    mc_start
    ;;
  backup)
    mc_stop
    mc_backup
    mc_start
    ;;
  status)
    mc_status
    ;;
  do)
    if ps ax | grep -v grep | grep -v -i SCREEN | grep $CRAFTBUKKIT_FILE > /dev/null
      then
        as_user "screen -p 0 -S $SERVERNAME -X stuff $'$3\n'"
      else
        echo $MSG_SERVER_SHUTDOWN
    fi
    ;;
  say)
    if ps ax | grep -v grep | grep -v -i SCREEN | grep $CRAFTBUKKIT_FILE > /dev/null
      then
        as_user "screen -p 0 -S $SERVERNAME -X stuff $'say $3\n'"
      else
        echo $MSG_SERVER_SHUTDOWN
      fi
    ;;
  *)
    mc_status
    exit 1
    ;;
esac
exit 0
